#include <linux/init.h>
#include <linux/module.h>
#include <linux/err.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/kobject.h>


struct kobject *mykobject01;
struct kset *mykset;
struct kobj_type mytype;



static int __init myhotplug_init(void)
{   
    int ret;
   
    // 创建并添加一个kset
    mykset = kset_create_and_add("mykset", NULL, NULL);

    // 分配并初始化kobj
    mykobject01 = kzalloc(sizeof(struct kobject), GFP_KERNEL);
    mykobject01->kset = mykset;

    // 添加kobj到kset
    ret = kobject_init_and_add(mykobject01, &mytype, NULL, "%s", "mykobject01");

    // 触发一个uevent事件，表示kobject属性发生变化。
    ret = kobject_uevent(mykobject01, KOBJ_CHANGE);

    printk(KERN_EMERG "myhotplug_init OK!\n");
    return 0;
}

static void __exit myhotplug_exit(void)
{
    // 释放kobj
    kobject_put(mykobject01);
    kset_put(mykset);
    printk(KERN_EMERG "myhotplug_exit OK!\n");  
}



module_init(myhotplug_init);
module_exit(myhotplug_exit);

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Treasure1029");
